package main

import (
	"fmt"
	"reflect"
)

/*===通过反射设置变量的值===
  -
*/
func main() {
	var a int64 = 100
	//setValue1(&a)//panic: reflect: reflect.Value.SetInt using unaddressable value
	setValue2(&a)
	fmt.Println("after update: a = ", a)
}

//修改值副本(值拷贝)，会引发panic
func setValue1(x interface{}) {
	/* [01] 获取 Value 对象 */
	value := reflect.ValueOf(x)
	if value.Kind() == reflect.Int64 {
		value.SetInt(202)
	}
	/* [02] 由于修改的是拷贝的值，不是指针指向的值，会引发 panic，使用 recover 捕获 */
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("出现了panic，错误信息panic为：", err)
		}
	}()

}

//获取指针修改值
func setValue2(x interface{}) {
	/* [01] 获取 Value 对象 */
	value := reflect.ValueOf(x)
	/* [02] 获取指针类型 */
	if value.Elem().Kind() == reflect.Int64 {
		value.Elem().SetInt(200)
	}

}
